import 'package:flutter/services.dart';

///
/// 调用原生方法的通道
///

/*
 * Flutter 与 Android iOS 原生的通信有以下三种方式
 * BasicMessageChannel 实现 Flutter 与 原生(Android 、iOS)双向通信 用于传递字符串和半结构化的信息，持续通信，收到消息后可以回复此次消息，
 *                     如：Native将遍历到的文件信息陆续传递到Dart，在比如：Flutter将从服务端陆陆续获取到信息交个Native加工，Native处理完返回等；
 * MethodChannel 实现 Flutter 与 原生原生(Android 、iOS)双向通信 用于传递方法调用（method invocation）一次性通信：如Flutter调用Native拍照；
 *              通常用来调用native中某个方法
 * EventChannel 实现 原生原生(Android 、iOS)向Flutter 发送消息 用于数据流（event streams）的通信，持续通信，收到消息后无法回复此次消息，
 *              通常用于Native向Dart的通信，如：手机电量变化，网络连接变化，陀螺仪，传感器等；
 */

//构建通道 (唯一) Flutter_app 自定义通道标识
//BasicMessageChannel
const basicMessageChannel = const BasicMessageChannel("flutter_basic_message_channel", StandardMessageCodec());

//MethodChannel
const methodChannel = const MethodChannel('flutter_method_channel');

//EventChannel
const eventChannel = const EventChannel('flutter_event_channel');

class ChannelUtils {

  ChannelUtils._internal();

  static final ChannelUtils _channelUtils = ChannelUtils._internal();

  factory ChannelUtils() => _channelUtils;

 /*
 * BasicMessageChannel
 * 实现Flutter 调用Android iOS原生方法并回调
 * arguments 发送给原生的参数 ,自定义基本数据格式{"method": "test", "content": "flutter 中的数据", "code": 100}
 * return数据 原生发给Flutter的参数,自定义基本数据格式{"code":100,"message":"消息","content":内容}
 */
  Future<Map> toolsBasicChannelMethodWithParams(Map arguments) async {
    var result;
    try {
      result = await basicMessageChannel.send(arguments);
    } on PlatformException catch (e) {
      result = {'Failed': e.message};
    }
    return result;
  }

  /*
  * MethodChannel
  * 在方法通道上调用方法invokeMethod
  * methodName 方法名称
  * params 发送给原生的参数，自定义基本数据格式{"code":100,"message":"消息","content":内容}
  * return数据 原生发给Flutter的参数,自定义基本数据格式{"code":100,"message":"消息","content":内容}
  */
  Future<String> toolsChannelMethodWithParams(String methodName, [dynamic params]) async {
    var result;
    try {
      result = await methodChannel.invokeMethod(methodName, params);
    } on PlatformException catch (e) {
      result = {'Failed': e.message};
    }
    return result;
  }


  /*
 * EventChannel
 * return数据 原生发给Flutter的参数,自定义基本数据格式{"code":100,"message":"消息","content":内容}
 * result listen监听结果
 */
  void toolsEventChannelMethod(dynamic result) {
    //不指定返回值类型，函数返回值默认为Object
    eventChannel.receiveBroadcastStream().listen(result);
  }
}
